package com.hjj.common.exception;

import com.hjj.common.result.R;
import com.hjj.common.result.ResponseEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.ConversionNotSupportedException;
import org.springframework.beans.TypeMismatchException;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingPathVariableException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.async.AsyncRequestTimeoutException;
import org.springframework.web.multipart.support.MissingServletRequestPartException;
import org.springframework.web.servlet.NoHandlerFoundException;

@Slf4j
@RestControllerAdvice // 异常切面 AOP,以json格式返回
public class unifiedExceptionHandler {

//	@ExceptionHandler(value = Exception.class)
//	public R handleException(Exception e){
//		log.error(e.getMessage(),e);
//		return R.error();
//	}
//
//	@ExceptionHandler(value = BadSqlGrammarException.class)
//	public R handleException(BadSqlGrammarException e){
//		log.error(e.getMessage(),e);
//		return R.setResult(ResponseEnum.BAD_SQL_GRAMMAR_ERROR);
//	}

	/**
	 * 业务层异常
	 * @param e
	 * @return
	 */
	@ExceptionHandler(value = BusinessException.class)
	public R handleException(BusinessException e){
		log.error(e.getMessage(),e);
		return R.error().msg(e.getMessage()).code(e.getCode());
	}

	/**
	 * controller上一层异常(servlet请求异常)
	 * @param e
	 * @return
	 */
	@ExceptionHandler({
			NoHandlerFoundException.class,
			HttpRequestMethodNotSupportedException.class,
			HttpMediaTypeNotSupportedException.class,
			MissingPathVariableException.class,
			MissingServletRequestParameterException.class,
			TypeMismatchException.class,
			HttpMessageNotReadableException.class,
			HttpMessageNotWritableException.class,
			MethodArgumentNotValidException.class,
			HttpMediaTypeNotAcceptableException.class,
			ServletRequestBindingException.class,
			ConversionNotSupportedException.class,
			MissingServletRequestPartException.class,
			AsyncRequestTimeoutException.class
	})
	public R handleException(Exception e){ //使用父异常类
		log.error(e.getMessage(), e);
		// SERVLET_ERROR(-102,"servlet请求异常")
		return R.error().code(ResponseEnum.SERVLET_ERROR.getCode()).msg(ResponseEnum.SERVLET_ERROR.getMsg());
	}
}
